home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / emul / cp4 / support / easy1541 / dev / examples / iecreadd64.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  4KB  |  239 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dos.h>
  5.  
  6. #include <exec/exec.h>
  7. #include <exec/execbase.h>
  8. #include <exec/memory.h>
  9. #include <dos/dos.h>
  10. #include <proto/exec.h>
  11. #include <proto/dos.h>
  12.  
  13. #include <iec/iec.h>
  14.  
  15. //----------------------------------------
  16. //IECReadD64 1.1
  17. //
  18. //Get a D64 image from the disk inserted in
  19. //the 1541 drive.
  20. //
  21. //----------------------------------------
  22.  
  23.  
  24. struct iecbase *IECBase;
  25.  
  26. char Version[]="$VER:64ReadD64 1.1 (06.10.96) by Fabrizio Farenga";
  27. UWORD BlockSize;
  28. unsigned char c;
  29. char* DestName;        //Name of the D64 file to create (using AmigaDos)
  30.  
  31. FILE *fh;    //Ouput File Handle
  32.  
  33. struct RDArgs *rda;
  34. LONG argv[3]={0,0,0};
  35. char device=8;    //Default device #
  36.  
  37. //******************************************
  38. // Send a null-terminated string to the 1541
  39. //******************************************
  40. void SendString(char* string)
  41. {
  42. int t;
  43. for (t=0;string[t]!=0;t++) CIOut(string[t]); 
  44. }
  45.  
  46.  
  47. //*****************************************************
  48. //Read sector MACRO
  49. //This read the sector "s" of track "t" to 
  50. //TrackBuffer[] (256 bytes)
  51. //*****************************************************
  52.  
  53. #define READSECTOR \
  54.     Listen(device);  \
  55.     Second(CMD_DATA+15);  \
  56.     sprintf(command,"U1: 2 0 %d %d",t,s); \
  57.     SendString(command); \
  58. \
  59.     UnListen(); \
  60. \
  61. \
  62.     Talk(device); \
  63.     TkSA(CMD_DATA+2); \
  64. \
  65.     c=0; \
  66.         while (IECBase->iec_ST==ST_OK) \
  67.         { \
  68.         chkabort(); \
  69.         TrackBuffer[c]=ACPtr(); \
  70.         c++; \
  71.         } \
  72. \
  73.     UnTalk();\
  74. \
  75.     printf ("Reading Track: %d, Sector %d   \nF",t,s);
  76.  
  77. //*****************************************************
  78.  
  79. void ReadDisk(char* outname)
  80. {
  81. int t,s,c;
  82. int buffernum;
  83. char command[40];
  84. char TrackBuffer[256];
  85.  
  86.  
  87. //Open the command channel
  88. Listen(device);    //OPEN 15,8,15
  89. Second(CMD_OPEN+15);
  90.  
  91.     if (IECBase->iec_ST!=ST_OK)
  92.     {
  93.     printf ("\n?DEVICE NOT PRESENT\n\n");
  94.     return;
  95.     }
  96.  
  97. //Reset the disk controller
  98. CIOut('I');        // PRINT#15,"I"
  99. UnListen();
  100.  
  101. //Open the data channel and allocate a buffer in the 1541 memory
  102. Listen(device);    //OPEN 2,8,2,"#"
  103. Second(CMD_OPEN+2);
  104. CIOut('#');
  105. UnListen();
  106.  
  107. //Get the buffer number (unused)
  108. Talk(device);    //GET #2,buffernum
  109. TkSA(CMD_DATA+2);
  110. buffernum=ACPtr();
  111. UnTalk();
  112.  
  113. //Open the D64 file to create
  114. fh=fopen (outname,"wb");
  115.  
  116.     //Read tracks 01 - 17 (21 sectors per track)
  117.     for (t=1;t<18;t++)
  118.     {
  119.         for (s=0;s<21;s++)
  120.         {
  121.         READSECTOR
  122.         //Write to AmigaDos
  123.         fwrite (TrackBuffer,256,1,fh);
  124.         }
  125.     }
  126.  
  127.     //Write tracks 18 - 24 (19 sectors per track)
  128.     for (t=18;t<25;t++)
  129.     {
  130.         for (s=0;s<19;s++)
  131.         {
  132.         READSECTOR
  133.         //Write to AmigaDos
  134.         fwrite (TrackBuffer,256,1,fh);
  135.         }
  136.     }
  137.  
  138.     //Write tracks 25 - 31 (18 sectors per track)
  139.     for (t=25;t<31;t++)
  140.     {
  141.         for (s=0;s<18;s++)
  142.         {
  143.         READSECTOR
  144.         //Write to AmigaDos
  145.         fwrite (TrackBuffer,256,1,fh);
  146.         }
  147.     }
  148.  
  149.     //Write tracks 31 - 35 (17 sectors per track)
  150.     for (t=31;t<36;t++)
  151.     {
  152.         for (s=0;s<17;s++)
  153.         {
  154.         READSECTOR
  155.         //Write to AmigaDos
  156.         fwrite (TrackBuffer,256,1,fh);
  157.         }
  158.     }
  159.  
  160. fclose (fh);
  161.  
  162.  
  163. Listen(device);    //Close 2
  164. Second(CMD_CLOSE+2);
  165. UnListen();
  166.  
  167. Listen(device);    //Close 15
  168. Second(CMD_CLOSE+15);
  169. UnListen();
  170.  
  171. printf ("\n\n");
  172.  
  173. }
  174.  
  175. /* Break Handler */
  176. int brk(void)
  177. {
  178. /* On break, close all */
  179.  
  180. fclose (fh);
  181.  
  182. Listen(device);    //Close 2
  183. Second(CMD_CLOSE+2);
  184. UnListen();
  185.  
  186. Listen(device);    //Close 15
  187. Second(CMD_CLOSE+15);
  188. UnListen();
  189.  
  190. CloseLibrary((struct Library*)IECBase);
  191. if (rda!=0) FreeArgs(rda);
  192.  
  193. printf ("\n\nBreak received.\n\n");
  194. return (1);
  195. }
  196.  
  197. void main(void)
  198. {
  199. if ((rda = ReadArgs("TO/A,DEVICE/N",argv,NULL)) != NULL)
  200.     {
  201.     if (argv[0]!=0) DestName=(char*)argv[0];    //Destination filename
  202.  
  203.     if (argv[1]!=0) device=*(LONG *)argv[1];    //Device (if none, device = 8)
  204.     }
  205. else
  206.     {
  207.     printf ("Required argument missing\n\n");
  208.     return;
  209.     }
  210.  
  211.  
  212. if (device<4)
  213.     {
  214.     printf ("\n?DEVICE NOT PRESENT\n\n");
  215.     return;
  216.     }
  217.  
  218. IECBase = (struct iecbase*)OpenLibrary("iec.library",0L);
  219.  
  220. if (IECBase!=0)
  221.     {
  222.  
  223.     /*Set the break handler*/
  224.     onbreak(&brk);
  225.  
  226.     ReadDisk(DestName);
  227.  
  228.     CloseLibrary((struct Library*)IECBase);
  229.     }
  230. else
  231.     {
  232.     printf ("Can't open iec.library\n");
  233.     return;
  234.     }
  235.  
  236.     if (rda!=0) FreeArgs(rda);
  237.  
  238. }
  239.